package org.example.cicdi.service.impl.third;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.example.cicdi.enums.EnumWhiteTableAnnotation;
import org.example.cicdi.service.impl.second.TableAnnotationServiceSecond;
import org.example.codegenerate.modelext.WebVo.Enum.EnumTableType;
import org.example.codegenerate.modelext.WebVo.annotation.table.TVo;
import org.example.codegenerate.modelext.WebVo.domian.table.TableVoDomain;
import org.example.codegenerate.modelext.WebVo.domian.table.WebModelVo;


import javax.persistence.Table;
@Data
@Slf4j
//@Component
public abstract class AbstractTVOAndTable implements TableAnnotationServiceSecond {
    protected   TableCondition localtableCondition=new TableCondition();

    @Override
    public String getCode() {
        return EnumWhiteTableAnnotation.TableDomain.getCode();
    }



    @Override
    public void handleTableVo(Class<?> cl, WebModelVo webModelVo) {
        TableCondition outtablecondition=new TableCondition();
        if(cl.getAnnotation(Table.class)!=null)
            outtablecondition.setHasorNotJpaTableAnnotation(EnumConsantExistType.HasTable.getStatus());
        else
            outtablecondition.setHasorNotJpaTableAnnotation(EnumConsantExistType.NoTable.getStatus());;
        if(cl.getAnnotation(TVo.class)!=null) {
            outtablecondition.setHasorNotSelfAnnotationTVO(EnumConsantExistType.HasTVO.getStatus());
        } else
            outtablecondition.setHasorNotSelfAnnotationTVO(EnumConsantExistType.NoTVO.getStatus());
        String mainorSonclass=webModelVo.getTableVoDomain().getTableName().length()>1?"主class":"子Class";
        if(localtableCondition.equals(outtablecondition)){
            log.info("当前正在处理的类是:{}，转换为TableDomainVo,类名为{}",mainorSonclass,cl.getName());
            execute(cl,webModelVo);
            log.info("当前已经处理完成的类:{}，转换为TableDomainVo,类名为{}",mainorSonclass,cl.getName());
        }
    }

    protected void setTVOwithTVOTag(Class<?> cl, TableVoDomain tableVoDomain, WebModelVo webModelVo){
        //TableVoDomain tableVoDomain=webModelVo.getTableVoDomain();
        TVo vo = cl.getAnnotation(TVo.class);

        tableVoDomain.setEntityName(vo.entityName());
        tableVoDomain.setEnumTableType(vo.enumTableType());
        tableVoDomain.setQueryMode(vo.queryMode());
        tableVoDomain.setRelationType(vo.relationType());
        tableVoDomain.setScroll(vo.scroll());

        tableVoDomain.setTableTxt(vo.tableTxt());
        tableVoDomain.setTabOrderNum(vo.tabOrderNum());
        tableVoDomain.setFormTemplate(vo.formTemplate());
        tableVoDomain.setIsTree(vo.isTree());

        tableVoDomain.setTreeParentIdField(vo.treeParentIdField());
        tableVoDomain.setTreeIdField(vo.treeIdField());
        tableVoDomain.setTreeFieldname(vo.treeFieldname());
        //如果是主表进行调用,设置为主表，如果是子表调用，就设置为子表
        if(webModelVo.getTableVoDomain().getTableName().length()>1){
            tableVoDomain.setEnumTableType(EnumTableType.SINGLETABLE);//然后在子表中进行更新为MainTable
        }else {
            tableVoDomain.setEnumTableType(EnumTableType.SONTABLE);
        }
    }
    protected void setTVOwithDefaultTVO(Class<?> cl,TableVoDomain tableVoDomain, WebModelVo webModelVo){
        //TableVoDomain tableVoDomain=webModelVo.getTableVoDomain();
        //TVo vo = cl.getAnnotation(TVo.class);


        tableVoDomain.setEntityName(cl.getSimpleName()/*vo.entityName()*/);
        tableVoDomain.setTableTxt(cl.getSimpleName()/*vo.tableTxt()*/);

        //tableVoDomain.setEnumTableType(EnumTableType.SINGLETABLE);
        tableVoDomain.setQueryMode("");
        tableVoDomain.setRelationType(0);
        tableVoDomain.setScroll(1);
        tableVoDomain.setTabOrderNum(0);
        tableVoDomain.setFormTemplate("1");
        tableVoDomain.setIsTree("");

        tableVoDomain.setTreeParentIdField("");
        tableVoDomain.setTreeIdField("");
        tableVoDomain.setTreeFieldname("");
        //如果是主表进行调用,设置为主表，如果是子表调用，就设置为子表
        if(webModelVo.getTableVoDomain().getTableName().length()>1){
            tableVoDomain.setEnumTableType(EnumTableType.SINGLETABLE);
        }else {
            tableVoDomain.setEnumTableType(EnumTableType.SONTABLE);
        }
    }
    protected abstract void execute(Class<?> cl, WebModelVo webModelVo);

}
